{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "59a8c5f7",
   "metadata": {},
   "source": [
    "# 概念\n",
    "## 什么是机器学习\n",
    "1. 访问大量数据集并从数据集中发现隐藏的模式和规律"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae41d76d",
   "metadata": {},
   "source": [
    "## 激活函数\n",
    "1. sigmoid函数 - 容易出现反向传播中梯度消失的问题 \n",
    "$$\n",
    "  f(x) = \\frac{1}{1 + e^{-x}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "715b7717",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "exp(-x)/(1 + exp(-x))**2\n"
     ]
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x')\n",
    "res = diff(1/(1 + exp(-x)),x)\n",
    "#latex(res)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ddd284c7",
   "metadata": {},
   "source": [
    "$$\n",
    "f^{\\prime}(x) = \\frac{e^{- x}}{\\left(1 + e^{- x}\\right)^{2}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e64f3856",
   "metadata": {},
   "source": [
    "2. Relu函数\n",
    "$$\n",
    "f(x)=\\begin{cases}\n",
    "0 & x \\lt 0 \\\\\n",
    "x & x \\geq 0\n",
    "\\end{cases}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "067c1490",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mQC45pprHPs0aNCA0NBQ4MJDv2vWrEnNmjUBCA0NvWD90aNH06xZM7755hs8PPJO2a+99lqSkpJ45plnGDx4MGazuUz9bFJSErt372bKlCncfvvtjvL8/r8477//Pnv37uXTTz/luuuuA6BXr16cPn2auXPnFqqff6E+/7j55xpTp05l7dq1jiH2bdu2pV69enz00UeORPvFF18kOzubb7/9ltq1azval5KSwn//+1+GDx+O1WotMs5nn32W0NBQvvzyS3x8fBxxNm/e/IKfjUhZaei4SCXRrl073n//fV5++WU2btxITk7OeeuvWbMGyLsSfbZbb7212H2uv/76AttNmjTBZDI5OkkADw8PGjZsyIEDBxxlq1atolmzZo4kO98dd9yBYRisWrWq2PdctWoV3bt3d3T+ABaLhX//+9/naZ2IiIhznJs0fvvtt5hMJgYNGkRubq7jKywsjMsuu4wff/wRyLsAnpqayj333ONIsivK3r172bVrF7fddhtAgTh79+5NfHw8u3fvBsrWzwYHB9OgQQNmzJjBq6++yrZt2wo9ElaUNWvWEBgYWOD8AeCWW24psr7JZCrwTHr+uUZ4eHiB59iDg4OpWbMmBw8edJTlty8/yc53xx13kJGRwYYNG4p8z1OnTrF582b69+/vSLIBAgMDC50PiZQHJdoilcQ777zD//3f//H2229zzTXXULt2bUaMGEF8fHyR9U+cOIGHhwfBwcEFyvOvrBelevXqBba9vLzw8/Mr0AHll2dmZhZ4r7M78HwRERGO14tT3L5FlYmIiDjbucO4ExMTMQyD+vXrY7VaC3xt3LiRpKQkAI4fPw7gkpU08oc2P/nkk4VifPTRRwEccZalnzWZTHz99df06tWL6dOn07VrV+rWrcvYsWNJS0srdr+kpKQizzeKOwcp7lzj3POS/PJzz0GKGop/oXOQ5ORk7Ha7zkHEZTR0XKSSqFGjBjExMcTExHDw4EG+/vprJk2axLFjx/j8888L1Q8ODiY3N5cTJ04USLYTEhKcHltwcHCRxz169CgAISEhpd63POIUERE517l3o0NCQjCZTHz//fd4e3sXqu/l5QXk9cuQN+lXRcvvV8eOHVvsMO78R7bK2s/WqVOHN954A4A///yTxYsXO4Zrv/rqq8XGt3nz5ot+z9IIDg4u8qbDhc5BqlWrhslk0jmI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s3btWk6cOEG3bt245557mDZtGqdPn2bChAnceuutrFixAoAnnniCt956i2nTpnHVVVdx9OhRdu7cCeQ9M9+xY0eWLVtGixYtirw7PnPmTBo2bEhsbCw///xzsXdh77rrLvbv38+CBQuoVasWn376KX369OG3336jcePGbNiwgbvvvpvJkyczcOBAlixZwtNPP13idg8dOpQ2bdrwxhtvYLFY2LZtW7Hnf++//z4vvvgi//vf/+jatSsLFizglVdeoX79+gXqrVixgtq1a7N69WrWrl3L8OHD+emnn7j66qvZsGEDH330Effddx/XXnstUVFRZGRk0KdPHzp37szPP/9MYmIiI0aM4KGHHuLtt98uMpZx48axcuVKFi1aRK1atZg4cSKbN28udN4ll6Ycm53tR1L5ef8Jth5MZsfRVPYfP1VsQu3raaFuiB91gv2IrO5LeJAPYUE+hAZ642fKpkGtGgT6eKq/v8SVOdFOT09n7969ju39+/fzyy+/EBwcTFRUFJMmTeLIkSOO9TVHjBjB7NmzmTBhAnfddRcbNmwgLi6u2D9sznA6x0bzSd+V2/HPZ/tzvfHzKtnHfPToUXJzcxk4cCB169YF4LLLLitULy0tjbi4OD744AN69uyJYRi89dZb1KlTp1DdG264gXvvvReASZMm8cYbb9ChQwduueUWACZMmECXLl1ISEggPDycadOm0bNnT5566ikAoqOj2b59OzExMUUm2suWLWPHjh3s37+f2rVrAzB58mSuv/76ErVZpLI7knyaH/88xuo/j7N+bxJJp7IL1fH1tNAkPJBmEYE0CQukcVggdYL9iLD64OHiO80iJVEeffkDDzzAddddxyuvvMK//vUvvvrqK1auXMmyZcvKpQ3u0tfna9SoEVOmTAHy+ue2bdsWeD593rx5REVFsXv3biIiInj11VeZOXMmQ4cOxWQy0bBhQ8ed5Pzh3yEhIcU+3mW1WgkMDMRisRRbZ+/evXz44YccOnSIWrVqAXnD+ZcsWcL8+fOZPHkyM2fOpHfv3jz++ONA3nnCunXrWLJkSYnafeDAAcaOHUvTpk0BaNy4cbF1Z82axfDhw7nrrrscn9PSpUsdz+jmCw4O5tVXX8VsNtOkSROmTJlCRkYGTz75JJB3keKll15i7dq1DBo0iPfff5/Tp0/zzjvv4O/vD8Brr73GjTfe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y4espaOjAz/99JPR7cCW+v9e+fn5mDBhAubNm/fAdW2l/0NCQiCXy/X+HrRaLcrLy40OvADr7Yuon73lekD8+Z653jDm+uGxt3zPXG9dtpDv7eKMtiFNTU2orq7W3fvw8uXLAHqPUvj5+UEmkyEtLQ1vvvkmvL294eXlhaysLERFRen9MMGCBQuQmJiI5cuXAwBWrFgBpVKJ6OhoxMbGYseOHaiuroZSqRz1NrW0tGD//v149913Dc5XKpUICAjQ/bLkO++8g5iYGISFhaGlpQWfffYZLly4YPJenKNFo9Fg06ZNWLx4Mfz8/HD9+nX85S9/gY+PDxITE4224bXXXsPcuXPx4YcfYtGiRTh06BDKysoGvZTI3Lq6urBs2TJUVlZi37596O7uRn19PQDA29sbzs7OBuO3lXUw2Hb79ttv48aNG7r7NyqVSnzxxRdYt24dXn31VVRUVCAvLw87d+60aNwAsGrVKnzzzTfYu3cv3N3ddf0uk8l0H+ruj3/btm0IDg5GREQEtFotCgoKcODAAXz99dcWjx8A3nzzTSxYsACBgYFoaGjA+++/j9bWVixbtsxg/LbU/316enqQn5+PZcuWwdFRP3XYWv9rNBq9MwhVVVU4f/48vL29ERgYiIyMDOTk5CAsLAwKhQKbN2+Gq6srlixZoqtjq/si0mePuR4Qb75nrmeuHwmx53vmesv3va3ne7sdaB8+fFiXMAHofrEzKysLGzZsAAC8//77cHR0RGpqKu7cuYPZs2cjNzcXDg4OunrXrl3T+xGD5ORkNDU14b333kN9fT0iIyNRWFiIoKCgUW/Tvn37IAiC0fs51tTUQCrtv0ihubkZK1asgEqlgqenJyZPnowjR47gySefHPVY7+fg4ID//Oc/+Prrr6FWq+Hn54dZs2Zh165d8PDwMNqGGTNmIC8vDxs3bkR2djZCQ0Oxa9cuvUu9LKG2thaHDx8G0Pvdq3v9/e9/x6xZswDY7joYbLutr69HTU2NrnxISAgKCwuxbt065Obmwt/fHzk5OYPex3U0bN++HQAGHFn9/PPPkZKSAmBg/FqtFllZWbhx4wZcXV0RERGBv/3tb8M6OmsON27cwCuvvILGxkaMHz9edxRbDP3f5/jx46iurkZqauqAebbW/2fPnsX8+fN1r9evXw8AWLZsGXJzc5GZmYn29na8/vrraG5uRkxMDIqLi0WxLyJ99pjrAfHme+Z65vqREHu+Z663fN/ber63+/toExEREREREVmSXXxHm4iIiIiIiMhWcKBNREREREREZEYcaBMRERERERGZEQfaRERERERERGbEgTYRERERERGRGXGgTURERERERGRGHGgTERERERERmREH2kRERERERERmxIE2ERERERERkRlxoE1ERERERERkRhxoExEREREREZkRB9pEREREREREZvT/li93iu1HkQkAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "matplotlib.rcParams['axes.unicode_minus']=False\n",
    "x = np.arange(-10,10,0.1)\n",
    "yy = np.arange(-0.25,1,0.01)\n",
    "xx = np.zeros_like(yy)\n",
    "sigmoid =1/(1 + np.exp(-x))\n",
    "rectified_sigmoid = (1 - np.exp(-x))/(1 + np.exp(-x))\n",
    "fig,ax = plt.subplots(1,2,facecolor='whitesmoke',edgecolor='yellow',figsize=(12,4))\n",
    "\n",
    "line0 = ax[0].plot(x,sigmoid,label='sigmoid')\n",
    "vertical0 = ax[0].plot(xx,yy,color='red',lw=2,ls='--',label='watershed line')\n",
    "ax[0].set_title('sigmoid')\n",
    "ax[0].legend()\n",
    "ax[0].grid(alpha=0.2)\n",
    "\n",
    "line1 = ax[1].plot(x,rectified_sigmoid,label='rectified_sigmoid')\n",
    "vertical1 = ax[1].vlines(x=0,ymin=-1,ymax=1,color='red',lw=2,ls='--',label='watershed line')\n",
    "ax[1].set_title('rectified sigmoid')\n",
    "ax[1].legend()\n",
    "ax[1].grid(alpha=0.2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "542dfbf0",
   "metadata": {},
   "source": [
    "3. tanh(x)\n",
    "$$\n",
    "    tanh(x) = \\frac{1-e^{-2x}}{1+e^{-2x}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "826a34dd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{2 e^{- 2 x}}{1 + e^{- 2 x}} - \\frac{2 e^{- 4 x}}{\\left(1 + e^{- 2 x}\\right)^{2}}$"
      ],
      "text/plain": [
       "2*exp(-2*x)/(1 + exp(-2*x)) - 2*exp(-4*x)/(1 + exp(-2*x))**2"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x')\n",
    "tanh = (1 - exp(-2*x)/(1 + exp(-2*x)))\n",
    "res = diff(tanh,x)\n",
    "res\n",
    "#latex(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc79a1d3",
   "metadata": {},
   "source": [
    "\n",
    "$$\n",
    "f^{\\prime}(x)=\\frac{2 e^{- 2 x}}{1 + e^{- 2 x}} - \\frac{2 e^{- 4 x}}{\\left(1 + e^{- 2 x}\\right)^{2}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84ee42a5",
   "metadata": {},
   "source": [
    "## 搭建神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "8b303a2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "from matplotlib.colors import ListedColormap\n",
    "\n",
    "# define activation function tanh\n",
    "def tanh(x):\n",
    "    return (1.0-np.exp(-2*x)/(1.0+np.exp(-2*x)))\n",
    "\n",
    "def tanh_derivative(x):\n",
    "    return (1+tanh(x))*(1-tanh(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "9627d5b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "class NeuralNetwork:\n",
    "    def __init__(self,net_arch):\n",
    "        '''\n",
    "        net_arch - a list of intergers,\n",
    "        symbolizing numbers of neurons in each layer:\n",
    "        input, hiddens, output\n",
    "        w - a numpy array-like weight matrix\n",
    "        '''\n",
    "        self.active = tanh\n",
    "        self.acitve_derivative = tanh_derivative\n",
    "        self.layers = len(net_arch)\n",
    "        self.steps_per_epoch = 1000\n",
    "        self.arch = net_arch\n",
    "        \n",
    "        self.weights = []\n",
    "        \n",
    "        for layer in range(self.layers - 1):\n",
    "            net_weight = np.random.rand(net_arch[layer]+1, net_arch[layer+1])\n",
    "            w = 2 * net_weight + 1\n",
    "            self.weights.append(w)\n",
    "    \n",
    "    def fit(self, data, labels, learning_rate=0.1, epochs=100):\n",
    "        # add b to the beginning of each data set\n",
    "        ones = np.ones((1,data.shape[0]))\n",
    "        Z = np.concatenate((ones.T,data),axis=1)\n",
    "        training = epochs * self.steps_per_epoch\n",
    "                    \n",
    "        # hidden layer forward transfer\n",
    "        sample = np.random.randint(data.shape[0])\n",
    "        y = [Z[sample]]\n",
    "        for i in range(len(self.weights)-1):\n",
    "            activation = np.dot(y[i],self.weights[i])\n",
    "            activity = self.active(activation)\n",
    "            activity = np.concatenate((np.ones(1),np.array(activity)))\n",
    "            y.append(activity)\n",
    "        \n",
    "        # last layer forward transfer\n",
    "        activation = np.dot(y[-1],self.weights[-1])\n",
    "        activity = self.active(activation)\n",
    "        y.append(activity)\n",
    "        \n",
    "        error = labels[sample] - y[-1]\n",
    "        delta_vec = [error * self.acitve_derivative(y[-1])]\n",
    "        for i in range(self.layers-2,0,1):\n",
    "            error = delta_vec[-1].dot(self.weights[i][1:].T)\n",
    "            error = error * self.active_derivative(y[i][1:])\n",
    "            delta_vec.append(error)\n",
    "            delta_vec.reverse()\n",
    "            \n",
    "        for i in range(len(self.weights) - 1):\n",
    "            layer = y[i].reshape(1,nn.arch[i]+1)\n",
    "            delta = delta_vec[i].reshape(1,nn.arch[i]-1)\n",
    "            self.weights[i] += learning_rate * layer.T.dot(delta)\n",
    "            \n",
    "        \n",
    "        for k in range(training):\n",
    "            if k % self.steps_per_epoch ==0:\n",
    "                print('epochs:{}'.format(k/self.steps_per_epoch))\n",
    "                for s in data:\n",
    "                    print(s, nn.predict(s))\n",
    "    \n",
    "    def predict(self,x):\n",
    "        val = np.concatenate((np.ones(1).T,np.array(x)))\n",
    "        for i in range(0, len(self.weights)):\n",
    "            val = self.active(np.dot(val,self.weights[i]))\n",
    "            val = np.concatenate((np.ones(1).T,np.array(val)))\n",
    "            return val[1]\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "35a60b8c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epochs:0.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:1.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:2.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:3.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:4.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:5.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:6.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:7.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:8.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "epochs:9.0\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n",
      "[0 0] 0.9844865785232075\n",
      "[0 1] 0.9999574542516756\n",
      "[1 0] 0.9999101532141145\n",
      "[1 1] 0.9999997573846278\n"
     ]
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\n",
    "    np.random.seed(0)\n",
    "    nn = NeuralNetwork([2,10,1])\n",
    "    X = np.array([[0,0],\n",
    "                 [0,1],\n",
    "                 [1,0],\n",
    "                 [1,1]])\n",
    "    y = np.array([0,1,1,0])\n",
    "    nn.fit(X,y,epochs=10)\n",
    "    for s in X:\n",
    "        print(s, nn.predict(s))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e050ba76",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6f5150fc",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python3.6",
   "language": "python",
   "name": "python3.6"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "315px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
